package cn.lg.soar.system.api.utils;

import cn.lg.soar.core.util.SoarSubscriber;
import cn.lg.soar.system.api.enums.AccessModeEnum;
import cn.lg.soar.system.api.model.BizFileDTO;
import cn.lg.soar.system.api.model.FastUploadVO;
import cn.lg.soar.system.api.model.FileVO;
import cn.lg.soar.system.api.service.IFileApi;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 系统文件
 * @author luguoxiang
 * @date 2025-07-15
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class SysFileUtils {

    private static IFileApi api;

    static {
        SoarSubscriber.subscribeInit(applicationContext -> {
            api = applicationContext.getBean(IFileApi.class);
        });
    }

    /**
     * 秒传（若系统已存在文件则秒传成功）
     * @param vo
     * @return
     */
    public static FileVO fastUpload(FastUploadVO vo) {
        return api.fastUpload(vo);
    }

    /**
     * 文件上传
     * @param file 文件
     * @param directory 上传目录
     * @param accessMode 访问权限
     * @return
     */
    public static FileVO upload(MultipartFile file, String directory, AccessModeEnum accessMode) {
        return api.upload(file, directory, accessMode);
    }

    /**
     * 上传附件（默认目录）
     * @param file 文件
     * @param accessMode 访问权限
     * @return
     */
    public static FileVO upload(MultipartFile file, AccessModeEnum accessMode) {
        return api.upload(file, accessMode);
    }

    /**
     * 保存业务附件
     * @param bizId 业务id
     * @param bizFiles 附件列表
     * @return 是否成功
     */
    public static boolean saveBizFile(Long bizId, Collection<BizFileDTO> bizFiles) {
        return api.saveBizFile(bizId, bizFiles);
    }

    /**
     * 保存业务附件（可变参数）
     * @param bizId 业务id
     * @param bizFiles 附件列表
     * @return 是否成功
     */
    public static boolean saveBizFile(Long bizId, BizFileDTO... bizFiles) {
        return saveBizFile(bizId, Arrays.asList(bizFiles));
    }

    /**
     * 获取业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型集合
     * @return Map<业务类型, 文件列表>
     */
    public static Map<String, List<FileVO>> getBizFile(Long bizId, Collection<String> bizTypes) {
        return api.getBizFile(bizId, bizTypes);
    }

    /**
     * 获取业务附件（可变参数）
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return Map<业务类型, 文件列表>
     */
    public static Map<String, List<FileVO>> getBizFile(Long bizId, String... bizTypes) {
        return getBizFile(bizId, Arrays.asList(bizTypes));
    }

    /**
     * 删除业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型集合
     * @return 是否成功
     */
    public static boolean removeBizFile(Long bizId, Collection<String> bizTypes) {
        return api.removeBizFile(bizId, bizTypes);
    }

    /**
     * 删除业务附件（可变参数）
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return 是否成功
     */
    public static boolean removeBizFile(Long bizId, String... bizTypes) {
        return removeBizFile(bizId, Arrays.asList(bizTypes));
    }

}
